#include<iostream>
#include "work1.h"
#include "class.h"
#include "gclass.h"
using namespace std;

void Table::AddWord(char *t)
{
	if(t[0]==0) return;
	index[indexEnd]=tableEnd;
	indexEnd++;
	int p;
	for(p=0;t[p]==32||t[p]==10;p++);
	while(t[p]!=0)
	{
		if(tableEnd<100 && indexEnd<100)
		{
			if(t[p]==32 || t[p]==10)
			{
				index[indexEnd]=tableEnd;
				indexEnd++;
				for(;t[p]==32;p++);
			}
			else
			{
				tableContent[tableEnd]=t[p];
				tableEnd++;
				p++;
			}
		}
	}	
}

int Table::AddWord(CompileString c,int type)
{
	int temp=indexEnd,i;
	c.pStr=c.pStrHead;
	index[indexEnd]=tableEnd;
	indexEnd++;
	for(i=0;buffer[i]!=0;i++)
	{
		tableContent[tableEnd]=buffer[i];
		tableEnd++;
	}
	return temp;
}

void Table::At(int n)
{
	if(n<indexEnd)
	{
		int j=0;int i;
		for(i=index[n];(n+1==indexEnd)?(i<tableEnd):(i<index[n+1]);i++)
		{
			buffer[j]=tableContent[i];
			j++;
		}
		buffer[j]=0;
	}
}

bool Collection::Intersect(Collection c)
{
	int i,j,k1,k2,k1E,k2E;
	for(i=1;i<indexEnd;i++)
	{
		for(j=1;j<c.indexEnd;j++)
		{
			k1=index[i];
			k2=c.index[j];
			(i+1==indexEnd)?(k1E=tableEnd):(k1E=index[i+1]);
			(j+1==c.indexEnd)?(k2E=c.tableEnd):(k2E=c.index[j+1]);
			while(k1<k1E && k2<k2E && tableContent[k1]==c.tableContent[k2])
			{
				if(k1+1==k1E && k2+1==k2E)
					return true;
				k1++;
				k2++;
			}
		}
	}
	return false;
}

void Collection::Merge(Collection c)
{
	int i,j,k1,k2,k1E,k2E,x;
	bool have;
	char temp[10];
	for(j=1;j<c.indexEnd;j++)
	{
		have=false;
		for(i=1;i<indexEnd;i++)
		{
			k1=index[i];
			k2=c.index[j];
			(i+1==indexEnd)?(k1E=tableEnd):(k1E=index[i+1]);
			(j+1==c.indexEnd)?(k2E=c.tableEnd):(k2E=c.index[j+1]);
			while(k1<k1E && k2<k2E && tableContent[k1]==c.tableContent[k2])
			{
				if(k1+1==k1E && k2+1==k2E)
				{
					have=true;
					break;
				}
				k1++;
				k2++;
			}
			if(have)
				break;
		}
		(j+1==c.indexEnd)?(k2E=c.tableEnd):(k2E=c.index[j+1]);
		if(!have)
		{
			x=0;
			for(k2=c.index[j];k2<k2E;k2++)
			{
				temp[x]=c.tableContent[k2];
				x++;
			}
			temp[x]=0;
			AddWord(temp);
		}
	}
}

void Collection::Print()
{
	int i,j=2;
	cout<<"{";
	for(i=0;i<tableEnd;i++)
	{
		cout<<tableContent[i];
		if(j!=indexEnd)
		{
			if(i+1==index[j])
			{
				cout<<",";
				j++;
			}
		}
	}
	cout<<"}"<<endl;
	for(j=0;j<indexEnd;j++)
		cout<<index[j]<<", ";
	cout<<tableEnd<<endl;
}

int Collection::SearchForWord()
{
	int i,j,n;
	for(i=1;i<indexEnd;i++)
	{
		j=index[i];
		n=0;
		while(tableContent[j]==buffer[n])
		{
			j++;
			n++;
			if(((i+1==indexEnd)?(j>=tableEnd):(j>=index[i+1]))&&(buffer[n]==0))
				return i;
		}
	}
	return 0;
}

void Collection::Delete(int i)
{
	int j,jEnd;
	if(i>0 && i<indexEnd)
	{
		if(i+1==indexEnd)
			tableEnd=index[i];
		else
		{
			jEnd=index[i+1];
			j=index[i];
			while(j<tableEnd)
			{
				tableContent[j]=tableContent[jEnd];
				jEnd++;
				j++;
				if(jEnd>=tableEnd)
					break;
			}
			tableEnd=j;
		}

	}
}